home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 October: Mac OS SDK / Dev.CD Oct 00 SDK1.toast / Development Kits / Mac OS / AppleShare IP 6.3 SDK / ASIP Registry / Sample Code / RegistryCookbook.c next >
Encoding:
C/C++ Source or Header  |  1999-11-01  |  14.6 KB  |  502 lines  |  [TEXT/CWIE]

  1. #include "AppleShareRegistry.h"
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stddef.h> /* needed for offsetof */
  6. #include <string.h>
  7.  
  8. #include    <Memory.h>
  9. #include    <TextUtils.h>
  10.  
  11. OAMNotificationUPP    gNotifyProc = NULL;
  12.  
  13.  
  14. void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type);
  15. void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id);
  16. void MyListRegistryAgents(unsigned char *  name, unsigned char * zone);
  17. OAMSessionID MyOpenLocalAgentSession();
  18. OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password);
  19. OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName);
  20. void MyListAllUserNames(OAMSessionID sess);
  21. void MyCreateUser(OAMSessionID sess, unsigned char * name);
  22. void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName);
  23. void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name);
  24. void MySetNotifyProc(OAMSessionID sessionID);
  25. void MyNotifyProc( OAMNotification *no );
  26.  
  27. void DisplayAttr(OAMAttributeDescriptor *attr);
  28. void ConcatUniqueNumString( unsigned char *name);
  29.  
  30. void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type)
  31. {
  32.     short len = 0;
  33.     
  34.     memset(obj, 0, sizeof(OAMObjectSpec));
  35.     obj->specType = kOAMObjectSpecByNameType;
  36.     obj->objectType = type;
  37.     len = *name + 1;
  38.     memcpy(obj->u.name, name, len);
  39. }
  40.  
  41. void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id)
  42. {
  43.     memset(obj, 0, sizeof(OAMObjectSpec));
  44.     obj->specType = kOAMObjectSpecByShortID;
  45.     obj->u.shortID = id;
  46. }
  47.  
  48.  
  49. void MyListRegistryAgents(unsigned char *  name, unsigned char * zone)
  50. {
  51.     UInt32                numInBuffer    = 0;
  52.     UInt32                numFound    = 0;
  53.     OAMStatus            err            = noErr;
  54.     char                buffer[2048];
  55.     OAMBufferDescriptor    lookup_bd;
  56.  
  57.  
  58.     OAMServerLocator*    loc            = NULL;
  59.     int                    loc_size    = offsetof(OAMServerLocator,protSpecific) + sizeof(Str32);
  60.  
  61.     OAMServerSpec        serverSpec;    
  62.     
  63.     int                    serverIndex;
  64.     
  65.     /* set up buffer descriptor */
  66.     lookup_bd.buffer    = buffer;
  67.     lookup_bd.bufferLen    = sizeof(buffer);
  68.     lookup_bd.actCount    = 0;
  69.     
  70.     /* Build AppleTalk OAMServerLocator */
  71.     loc = (OAMServerLocator *) NewPtr(loc_size);
  72.     memset(loc, 0, loc_size);
  73.     loc->specSize = loc_size;
  74.     loc->protType = kOAMLocatorAppletalk;
  75.     memcpy (loc->name, name, sizeof(Str32));            
  76.     memcpy (loc->protSpecific, zone, sizeof(Str32));    
  77.     
  78.      err = OAMFindServer(loc, &lookup_bd, &numInBuffer, &numFound, NULL);
  79.     printf("Found %d AppleShare Registry Agent(s).\n", numFound);    
  80.  
  81.     for (serverIndex = 1; serverIndex<=numInBuffer; serverIndex++)
  82.     {
  83.         err = OAMFindServerExtract(&lookup_bd, serverIndex,&serverSpec);
  84.         p2cstr(serverSpec.name);
  85.         printf("%s\n", serverSpec.name);
  86.     }
  87. }
  88. OAMSessionID MyOpenLocalAgentSession()
  89. {
  90.     OAMStatus        err = noErr;
  91.     OAMSessionID    sessID = 0;
  92.     
  93.     err = OAMOpenSession(NULL, &sessID, NULL);
  94.     
  95.     return sessID;
  96. }
  97.  
  98. OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password)
  99. {    
  100.     OAMStatus        err = noErr;
  101.     OAMObjectSpec    obj;
  102.     OAMKey        key;
  103.     
  104.     memset(&key, 0, sizeof(key));
  105.     memcpy(&key.keyBuffer, password, 8);
  106.     key.keyBufferLen = 8;
  107.     BuildObjectSpecByNameType(&obj, name, kOAMUser);
  108.     err = OAMAuthenticateSession(sess, &obj, &key, NULL);
  109.  
  110.     return err;
  111. }
  112.  
  113. OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName)
  114. {
  115.     OAMStatus        err = noErr;
  116.     OAMObjectSpec    machineObj;    
  117.     OAMAttributeDescriptor myAttrDesc[2] = {};
  118.     
  119.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  120.     
  121.     myAttrDesc[0].attributeSignature = kOAMMachine;
  122.     myAttrDesc[0].attributeType = kOAMServerName;
  123.     myAttrDesc[0].bufferDescriptor.buffer = machineName;
  124.     myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
  125.     myAttrDesc[0].bufferDescriptor.actCount = sizeof(Str31);
  126.     /* null terminate array of attribute descriptors */
  127.     myAttrDesc[1].attributeSignature = NULL;
  128.  
  129.     BuildObjectSpecByShortID(&machineObj, kOAMMachineShortID);    
  130.     err = OAMGetAttribute(sess, &machineObj,  myAttrDesc, NULL);
  131.  
  132.     return err;
  133. }
  134. void DisplayAttr(OAMAttributeDescriptor *attr)
  135. {
  136.     if (attr && attr->attributeSignature) {
  137.         printf("---------------------------------\n");
  138.         printf("attr->status = %d\n",attr->status );
  139.         printf("attr->offset = %d\n",attr->offset );
  140.         printf("attr->actSize = %d\n",attr->actSize );
  141.         printf("attr->bufferDescriptor.bufferLen = %d\n",attr->bufferDescriptor.bufferLen );
  142.         printf("attr->bufferDescriptor.actCount = %d\n",attr->bufferDescriptor.actCount );
  143.         if (attr->status == 0)
  144.         {
  145.         switch (attr->attributeSignature) {
  146.             case kOAMBasic:
  147.                 switch (attr->attributeType) {
  148.                         case kOAMName:
  149.                         {
  150.                              StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
  151.                             p2cstr(name);
  152.                             printf("Name = %s",name);
  153.                         }
  154.                         break;
  155.                         case kOAMInternetName:
  156.                         {
  157.                             StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
  158.                             p2cstr(name);
  159.                             printf("Name = %s",name);
  160.                         }
  161.                         break;
  162.                         case kOAMShortID:
  163.                             printf("ID = %d",*((UInt32*)attr->bufferDescriptor.buffer));
  164.                         break;    
  165.                         case kOAMType:
  166.                             printf("Type = %.4s",(char*)attr->bufferDescriptor.buffer);
  167.                         break;    
  168.                 };
  169.             break;
  170.             case kOAMUser:
  171.                 switch (attr->attributeType) {
  172.                         case kOAMUserFlags:
  173.                             printf("userFlags = 0x%x",*((UInt16*)attr->bufferDescriptor.buffer));
  174.                         break;    
  175.                         case kOAMUserComment:
  176.                         {
  177.                             printf("comment = %#s",(StringPtr)attr->bufferDescriptor.buffer);
  178.                         }
  179.                         break;
  180.                         case kOAMPasswordLen:
  181.                             printf("pwdLen = %d",*((UInt8*)attr->bufferDescriptor.buffer));
  182.                         break;
  183.                         case kOAMLastLogin:
  184.                         {
  185.                             DateTimeRec    date = {};
  186.                             SecondsToDate(*(UInt32*)attr->bufferDescriptor.buffer, &date);
  187.                             printf("kLastLogin: %d/%d/%d", date.month, date.day, date.year);
  188.                         }
  189.                         break;
  190.                 };
  191.                 
  192.             break;
  193.             
  194.             case kOAMService:
  195.                 switch (attr->attributeType) {
  196.                         case kOAMShortStatus:
  197.                             printf("shortStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  198.                         break;
  199.                         /*
  200.                         case kOAMDetailedStatus:
  201.                             printf("detailedStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  202.                         break;    
  203.                         */
  204.                         case kOAMServiceFlags:
  205.                             printf("kServiceFlags = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  206.                         break;    
  207.                 };
  208.             break;
  209.             
  210.             case kOAMMachine:
  211.                 switch (attr->attributeType) {
  212.                         case kOAMGuestProgramLinking:
  213.                             printf("kGuestProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  214.                         break;    
  215.                         case kOAMNoGuestAccess:
  216.                             printf("kNoGuestAccess = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  217.                         break;    
  218.                         case kOAMProgramLinking:
  219.                             printf("kProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  220.                         break;    
  221.                         case kOAMServerName:
  222.                             printf("name = %#s",(StringPtr)attr->bufferDescriptor.buffer);
  223.                         break;    
  224.                         case kOAMMultihoming:
  225.                             printf("kMultihoming = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  226.                         break;    
  227.                         case kOAMNoSavePassword:
  228.                             printf("kNoSavePassword = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  229.                         break;    
  230.                         case kOAMMinPasswordLen:
  231.                             printf("kMinPasswordLen = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  232.                         break;    
  233.                         case kOAMMaxBadLogins:
  234.                             printf("kMaxBadLogins = %d",*((UInt16*)attr->bufferDescriptor.buffer));
  235.                         break;    
  236.                         case kOAMDefaultShutdown:
  237.                             printf("kDefaultShutdown = %d",*((UInt16*)attr->bufferDescriptor.buffer));
  238.                         break;    
  239.                         case kOAMUniqueID:
  240.                             printf("kUniqueID = %d",*((UInt32*)attr->bufferDescriptor.buffer));                        
  241.                         break;
  242.                 };
  243.             break;
  244.  
  245.             case kOAMGestalt:
  246.                 printf("selector: %.4s response: %X", (char*)&attr->attributeType, *((SInt32*)attr->bufferDescriptor.buffer));
  247.             break;            
  248.             
  249.  
  250.         }    
  251.         printf(" <status, len> = <%d, %d> ",attr->status,attr->bufferDescriptor.actCount );
  252.         printf("\n---------------------------------\n");
  253.         
  254.         }
  255.     
  256.     }
  257. }
  258. void MyListAllUserNames(OAMSessionID sess)
  259. {    
  260.     OAMStatus            err = noErr;
  261.     OAMIterationSpec    iter;
  262.     UInt32                maxToGet    = 15;
  263.     OAMType                typeList[2] = {kOAMUser,0};
  264.     char                bd_buffer[4096] = {};
  265.     char                iter_buffer[512] = {};
  266.     OAMBufferDescriptor    bd    = {};
  267.     OAMAttributeDescriptor iter_attr[2] = {};
  268.     Str31                userName = {};
  269.     int                 userCount = 0;
  270.     
  271.     /* set up buffer descriptor */
  272.     bd.buffer    = bd_buffer;
  273.     bd.bufferLen = sizeof(bd_buffer);
  274.     bd.actCount    = 0;
  275.     
  276.     /* set up iter spec */
  277.     memset(&iter, 0 , sizeof(iter));
  278.     iter.iterationType = kOAMIterObjects;
  279.     iter.typeList    = typeList;
  280.     iter.iterationFlags = kOAMIterByIndex;
  281.     iter.u.startingIndex = 1;
  282.     iter.maxToGet = maxToGet;
  283.  
  284.     /* set up iter_attr */
  285.     iter_attr[0].attributeSignature = kOAMBasic;
  286.     iter_attr[0].attributeType = kOAMName;
  287.     iter_attr[0].bufferDescriptor.buffer = userName;
  288.     iter_attr[0].bufferDescriptor.bufferLen = sizeof(iter_buffer);
  289.     iter_attr[0].bufferDescriptor.actCount = 0;
  290.     /* null terminate array of attribute descriptors */
  291.     iter_attr[1].attributeSignature = NULL;
  292.     
  293.     do
  294.     {
  295.         err = OAMIterate(sess, &iter, iter_attr, &bd, NULL);
  296.         
  297.         if(!err) {
  298.             OAMObjectSpec obj = {};
  299.             OAMParseInfo parseInfo;
  300.             int            attrIndex;
  301.             
  302.             memset(&parseInfo, 0, sizeof(OAMParseInfo));
  303.             err = OAMParseAttributeBuffer(&bd, iter_attr, &parseInfo);            
  304.  
  305.         
  306.             while(OAMParseGetNextObject(&parseInfo, &obj) != kOAMParseDone) {
  307.                 printf("id = %d type = %s\n", obj.u.shortID, (char*)&obj.objectType);
  308.                 for ( attrIndex = 0; ; attrIndex++)
  309.                 {
  310.                     if (OAMParseGetNextAttribute(&parseInfo, &iter_attr[attrIndex]) != kOAMParseDone)
  311.                         DisplayAttr(&iter_attr[attrIndex]);
  312.                     else
  313.                         break;
  314.                 }
  315.                 userCount++;
  316.             }
  317.             iter.u.startingIndex += maxToGet;
  318.         }
  319.     } while (!err && iter.more );
  320.     printf("userCount(%d)\n",userCount);
  321. }
  322.  
  323. void MyCreateUser(OAMSessionID sessionID, unsigned char *name)
  324. {
  325.     OAMStatus        err = noErr;
  326.     OAMObjectSpec    userObj;    
  327.     OAMAttributeDescriptor myAttrDesc[3] = {};
  328. #if    0    // This line generates a compiler error in CW Pro 5
  329.     char            password[8] = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
  330. #else
  331.     char            password[8] = { 't', 'e', 'm', 'p', 0, 0, 0, 0 };
  332. #endif
  333.     UInt16            userFlags = kOAMLoginEnabledMask | kOAMGetNewPwdMask;
  334.     
  335.     printf("userFlags(0x%X)\n",userFlags);
  336.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  337.     /* password attribute */
  338.     myAttrDesc[0].attributeSignature = kOAMUser;
  339.     myAttrDesc[0].attributeType = kOAMPasswordAttribute;
  340.     myAttrDesc[0].bufferDescriptor.buffer = password;
  341.     myAttrDesc[0].bufferDescriptor.bufferLen = 8;
  342.     myAttrDesc[0].bufferDescriptor.actCount = 0;
  343.     /* user flags attribute */
  344.     myAttrDesc[1].attributeSignature = kOAMUser;
  345.     myAttrDesc[1].attributeType = kOAMUserFlags;
  346.     myAttrDesc[1].bufferDescriptor.buffer = &userFlags;
  347.     myAttrDesc[1].bufferDescriptor.bufferLen = sizeof(userFlags);
  348.     myAttrDesc[1].bufferDescriptor.actCount = 0;
  349.     /* null terminate array of attribute descriptors */
  350.     myAttrDesc[2].attributeSignature = NULL;
  351.  
  352.     printf("CreateUser(%#s)\n", name);
  353.     BuildObjectSpecByNameType(&userObj,(StringPtr) name, kOAMUser);
  354.     err = OAMCreateObject(sessionID, &userObj, NULL, NULL);
  355.  
  356. }
  357.  
  358. void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName)
  359. {
  360.     OAMStatus            err            = noErr;
  361.     OAMAuthenticateInfo    auth        = {};
  362.     OAMObjectSpec        userObj        = {};
  363.     OAMBufferDescriptor    input        = {};
  364.     OAMBufferDescriptor output        = {};
  365.     char    output_buffer[16]        = {};
  366. #if    0    // This line generates a compiler error in CW Pro 5
  367.     char            password[8] = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
  368. #else
  369.     char            password[8] = { 't', 'e', 'm', 'p', 0, 0, 0, 0 };
  370. #endif
  371.     
  372.     /* set up user object */
  373.     BuildObjectSpecByNameType(&userObj,(StringPtr) userName, kOAMUser);
  374.     
  375.     /* set up authInfo */
  376.     auth.objectSpec = &userObj;
  377.     auth.flags = 0;
  378.     auth.stage = kOAMAuthLogin;
  379.     memcpy(auth.uam,"Cleartxt Passwrd",sizeof("Cleartxt Passwrd"));
  380.  
  381.     /* set up input buffer */
  382.     input.buffer = &password;
  383.     input.bufferLen = 8;
  384.     input.actCount = 8;
  385.  
  386.     /* set up output buffer */
  387.     output.buffer = &output_buffer;
  388.     output.bufferLen = 16;
  389.  
  390.     err = OAMAuthenticateObject(sessionID, &auth, &input, &output, NULL);
  391.     
  392.     printf("OAMAuthenticateObject err:%d\n", err);
  393.     printf("authInfo->objStatus(%d)\n",    auth.objStatus);
  394.  
  395. }
  396.  
  397. void ConcatUniqueNumString( unsigned char *name)
  398. {
  399.     unsigned long secs;
  400.     Str255    datestr;
  401.     
  402.     GetDateTime(&secs);
  403.     NumToString(secs, datestr);
  404.     p2cstr(datestr);
  405.     p2cstr((unsigned char *)name);
  406.     
  407.     strcat((char*) name, (const char *)datestr); /* userXXXXX */
  408.     
  409.     c2pstr((char*)name);
  410.  
  411. }
  412. void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name)
  413. {
  414.     OAMStatus        err = noErr;
  415.     OAMAttributeDescriptor myAttrDesc[2] = {};
  416.     
  417.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  418.     
  419.     myAttrDesc[0].attributeSignature = kOAMBasic;
  420.     myAttrDesc[0].attributeType = kOAMName;
  421.     myAttrDesc[0].bufferDescriptor.buffer = name;
  422.     myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
  423.     myAttrDesc[0].bufferDescriptor.actCount = 0;
  424.     /* null terminate array of attribute descriptors */
  425.     myAttrDesc[1].attributeSignature = NULL;
  426.  
  427.     err = OAMSetAttribute(sess, userObj,  myAttrDesc, NULL);
  428. }
  429. void MyNotifyProc( OAMNotification *no )
  430. {    
  431.     printf("vers %d sess %X objectID %d notifyID %d userData %X type %X \n",
  432.             no->version, no->sess, no->objectID, no->notifyID, no->userData, no->u.oamType);
  433. }
  434. void MySetNotifyProc(OAMSessionID sessionID)
  435. {
  436.     OAMStatus err = noErr;
  437.     OAMNotifyOption notifyNewObj = { kOAMNotifyNewObject, 0 };
  438.     OAMBooleanOption setSelf = { true };
  439.     OAMNotificationSpec spec[3];
  440.     
  441.     err = OAMSetNotificationProc(sessionID, gNotifyProc, NULL);
  442.     
  443.     /* set up NotifySpec */    
  444.     memset(&spec, 0, sizeof(spec));
  445.     /* NOTIFY NEW OBJECT */
  446.     spec[0].oamType = kOAMNotifyStartOption;
  447.     spec[0].bufferDescriptor.buffer = ¬ifyNewObj;
  448.     spec[0].bufferDescriptor.bufferLen = sizeof(OAMNotifyOption);
  449.     
  450.     /* NOTIFICATION (SETSELFSEND == TRUE BY DEFAULT) */
  451.     spec[1].oamType = kOAMNotifySelfOption;
  452.     spec[1].bufferDescriptor.buffer = &setSelf;
  453.     spec[1].bufferDescriptor.bufferLen = sizeof(OAMBooleanOption);
  454.     /* terminator */
  455.     spec[2].oamType = 0;
  456.  
  457.     err = OAMRequestNotification(sessionID, spec, NULL);
  458.     
  459. }
  460.  
  461. int main ( void )
  462. {
  463.     OAMStatus         err = noErr;
  464.     OAMSessionID    sessionID = 0;
  465.     Str31            machineName = {};
  466.     Str31            userName = "\puser";
  467.     Str31            newName = "\pnewName";
  468.     OAMObjectSpec    userObj;
  469.  
  470.     /* initialize Registry library for 4 maximum sessions*/
  471.     err = OAMInitialize(4, 0, NULL, NULL);
  472.     printf("OAMInitialize err: %d\n", err);    
  473.  
  474.     gNotifyProc = NewOAMNotificationProc(MyNotifyProc);
  475.     
  476.     MyListRegistryAgents("\p≈", "\p*"); 
  477.     sessionID = MyOpenLocalAgentSession();
  478.     if (sessionID)
  479.     {
  480.         MySetNotifyProc(sessionID);
  481.     /*
  482.         err = MyGetMachineName(sessionID, machineName);
  483.         printf("MachineName(%#s)\n", machineName);
  484.  
  485.         MyListAllUserNames(sessionID); 
  486.     */    
  487.         ConcatUniqueNumString(userName);
  488.         MyCreateUser(sessionID, userName);
  489.         MyAuthenticateUser(sessionID, userName);
  490.  
  491.         ConcatUniqueNumString(newName);
  492.         BuildObjectSpecByNameType(&userObj, userName, kOAMUser);
  493.         MyChangeUserName(sessionID, &userObj, newName);
  494.  
  495.         err = OAMDeleteObject(sessionID, &userObj, NULL);
  496.  
  497.         OAMCloseSession(sessionID, NULL);
  498.     }
  499.     err = OAMDeInitialize();
  500.  
  501.     return 0;
  502. }